﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
/*
 * 单例类：
 *          全局只实例化一个对象
 */

namespace 面向对象_单例类
{
    //问题：由于Map是一个普通类，可以在程序中随便new出对象
    //尝试1：静态类，不能够实例化对象，所以不符合只实例化一个对象的需求
    //尝试2(正解)：将类内手写的无参构造方法变成private权限，外界就无法new对象了
    class Map
    {
        //假设：instance就是所说的全局唯一的Map对象
        //问题：如何不通过new对象，访问本实例
        static private Map instance = new Map();
        //之所以使用private修饰instance，是因为不想让外界更改instance的值

        static public Map GetInstance()
        {
            return instance;
        }
        public int Width { set; get; }
        public int Height { set; get; }

        public void SayInfo() 
        { 
            Console.WriteLine("宽度{0} , 高度{1}",Width,Height);
        }

        //一旦用户自己编写了某一种构造方法，系统就不会自动生产无参构造方法了
        private Map() { }
    }

    class Test
    {
        static private Test instance = new Test();
        static public Test GetInstance()
        {
            return instance;
        }

        public int Width { set; get; }

        public int Height { set; get; }

        private Test() { }
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            //1 加载了Map类
            //2 扫描Map类当中的静态变量发现了instance
            //3 初始化静态类instance = new Map()
            //4 instance就是Map类全局唯一的实例

            //由于Map构造方法是私有的，所以无法new Map的对象
            //Map map = new Map();

            //Map.instance.Height = 100;
            //Map.instance.Width = 200;
            //Map.instance.SayInfo();

            //Map.instance = null;

            Map.GetInstance().Width = 100;
            Map.GetInstance().Height = 200;
            Map.GetInstance().SayInfo();

            Console.Read();
        }
    }
}
